/*
 * @Author: zw
 * @Date: 2020-11-30 08:30:58
 * @LastEditors: Zhang Wei
 * @LastEditTime: 2021-12-30 14:16:26
 * @FilePath: \consumer\utils\network.js
 * @Description: 微信数据请求，封装
 */

// import $CONST from '../config/const';

import {
  getServiceVersion,
  getToken,
  setToken,
  splicingPath, // 拼接重定向路径
} from './util';

// import UrlConfig from '../config/url';
// const AUTH_PATH = $CONST.PAGE_PATH.AUTH; // 授权页地址
const AUTH_PATH = ""; // 授权页地址

const MAIN_URL = "https://api.geely.test.zzzw666.top/smart-api"
// const MAIN_URL = "http://localhost:1024"

const urlConfig = {
  requestURL: MAIN_URL,
  socketURL: '#{socketURL}',
  uploadFileURL: MAIN_URL,
  downloadFileURL: MAIN_URL,
  staticURL: MAIN_URL,
  udpURL: '#{udpURL}',
  webViewURL: MAIN_URL,
};;

// const merchantCd = getExtMserchantCd();
// const baseUrl = `${urlConfig.requestURL}/${merchantCd}`; // 基础请求地址
const baseUrl = `${urlConfig.requestURL}`; // 基础请求地址
const uploadFileURL = `${urlConfig.uploadFileURL}`; // 文件上传地址

// 打印当前配置
// console.log(urlConfig, 'urlConfig');

export const $ajax = function (options) {
  // 默认选项
  const defaultOptions = {
    url: '',
    baseUrl,
    method: 'GET',
    header: requestHeader(options.isJson, options.noToken, options.method), // 请求头
    data: {},
    loading: true,
    loadingWord: '加载中...',
    isJson: false,
    noToken: false,
    completeCB: '', // 完成后的回调
    errorTipsShow: true, // 错误提示（并非所有错误提示），作用在‘请求成功，但是res.data.success不为true’的情况【此时默认弹窗不会弹出，错误内容需要自行处理】
    checkSV: true, // 验证服务器版本号
    redirect: true, // 校验出错是否重定向
    // 过滤返回参数
    resFilter(res) {
      return res;
    },
  };

  // 属性覆盖
  Object.assign(defaultOptions, options);

  // 等待动画
  if (defaultOptions.loading) {
    wx.showLoading({
      title: defaultOptions.loadingWord,
      // showLoading: 999,
      // showLoading: 999,
      mask: true, // 显示透明蒙层，防止触摸穿透
    });
  }

  // 发起请求
  return new Promise((resolve, reject) => {
    wx.request({
      url: defaultOptions.baseUrl + defaultOptions.url,
      method: defaultOptions.method,
      data: defaultOptions.data,
      header: defaultOptions.header,
      success: (res) => {
        // console.log(res, 'res wx.request');

        // 基本返回拦截
        let filterRes = defaultOptions.resFilter(res);
        if (filterRes === true) {
          resolve(res);
          return false;
        }

        /*===============  请求成功，操作成功  ===============*/
        if (res.statusCode === 200) {
          if (res.data.ok) {
            /*===============  比较服务端与本地版本号（接口版本号）  ===============*/
            // const resSv = res.header.version; // 获取服务器版本号
            // if (resSv && defaultOptions.checkSV) {
            //   // 服务器没有给版本号 就不比较
            //   const localSV = getServiceVersion();
            //   // 本地接口版本号与当前服务器返回的版本号不一致
            //   // TODO: 小程序升级
            //   if (resSv !== localSV) {
            //     wx.showModal({
            //       title: '升级',
            //       content: '检测到小程序已更新!需要重新加载',
            //       showCancel: false,
            //       success() {
            //         wx.$router.push({
            //           url: splicingPath(AUTH_PATH, defaultOptions.redirect),
            //         });
            //       },
            //     });
            //   }
            // }

            resolve(res.data);
          } else {
            /*===============  请求成功，操作失败  ===============*/
            // 不显示错误提示
            if (defaultOptions.errorTipsShow) {
              switch (res.data.errorCode) {
                case 1005 || 1006:
                  wx.showModal({
                    title: '登录超时',
                    content: res.data.msg,
                    showCancel: false,
                    success: function (res) {
                      if (res.confirm) {
                        reLogin(defaultOptions);
                      }
                    },
                  });
                  break;
                case 1007:
                  wx.showModal({
                    content: res.data.msg || '无权限',
                    showCancel: false,
                  });
                  break;
                case 1007:
                  wx.showModal({
                    content: res.data.msg || '认证信息已过期，需要重新登录',
                    showCancel: false,
                    success: function (res) {
                      if (res.confirm) {
                        reLogin(defaultOptions);
                      }
                    },
                  });
                  break;
                case 1009:
                  wx.showModal({
                    content: res.data.msg || '参数非法',
                    showCancel: false,
                  });
                  break;
                case 1010:
                  wx.showModal({
                    content: res.data.msg || '未获取到数据',
                    showCancel: false,
                  });
                  break;
                case 1011:
                  wx.showModal({
                    content: res.data.msg || '无效的操作',
                    showCancel: false,
                  });
                  break;
                case 9997:
                  wx.showModal({
                    content: res.data.msg || '您的请求太过频繁，请休息一下',
                    showCancel: false,
                  });
                  break;
                case 9998:
                  wx.showModal({
                    content: res.data.msg || '系统繁忙，请稍后再试',
                    showCancel: false,
                  });
                  break;
                case 9999:
                  wx.showModal({
                    content: res.data.msg || '系统异常',
                    showCancel: false,
                  });
                  break;
                default:
                  // 其他错误
                  wx.showModal({
                    title: res.data.success === false ? '' : '服务器请求失败',
                    content: res.data.msg || '未知错误',
                    showCancel: false,
                  });
              }
            }
            console.log(res);
            reject(res);
            return false;
          }
        } else {
          console.log(res.statusCode, 'res.statusCode');
          // console.log(res, 'res res.statusCode');

          /*===============  返回码不为200  ===============*/
          switch (res.statusCode) {
            case 400:
              wx.showModal({
                title: '400 参数错误',
                content: res.data.msg || '参数错误',
                showCancel: false,
              });
              break;
            case 401:
              wx.showModal({
                // content: res.data.msg || '需要登录',
                content: '需要登录',
                success: function (res) {
                  if (res.confirm) {
                    reLogin(defaultOptions);
                  }
                },
              });
              break;
            case 403:
              wx.showModal({
                title: '拒绝访问',
                content: res.data.msg || '服务器拒绝访问',
                showCancel: false,
              });
              break;
            case 404:
              wx.showModal({
                // title: '请求地址出错',
                content: '请求地址出错',
                // content:
                //   (res.data.msg || '') +
                //   'url: ' +
                //   defaultOptions.baseUrl +
                //   defaultOptions.url,
                showCancel: false,
              });
              break;
            case 408:
              wx.showModal({
                content: res.data.msg || '请求超时',
                showCancel: false,
              });
              break;
            case 500:
              wx.showModal({
                // title: '500 错误',
                content: res.data.msg || '服务器内部错误',
                showCancel: false,
              });
              break;
            case 501:
              wx.showModal({
                content: res.data.msg || '服务未实现',
                showCancel: false,
              });
              break;
            case 502:
              wx.showModal({
                title: '502 服务器响应失败',
                content: res.data.msg || '网关错误，无效响应',
                showCancel: false,
              });
              break;
            case 503:
              wx.showModal({
                content: res.data.msg || '服务不可用',
                showCancel: false,
              });
              break;
            case 504:
              wx.showModal({
                content: res.data.msg || '网关超时',
                showCancel: false,
              });
              break;
            default:
              wx.showModal({
                content: res.data.msg,
                showCancel: false,
              });
              break;
          }
          reject(res);
        }
      },
      fail: (res) => {
        console.log(res, 'network fail res');
        reject(res);
        wx.showModal({
          title: '提示',
          content: '请求失败！请检查网络！' + JSON.stringify(res),
          showCancel: false
        });
      },
      complete: (res) => {
        // console.log(res, 'complete res');
        if (defaultOptions.loading) wx.hideLoading();
        if (typeof completeCB === 'function') completeCB(res);
      },
    });
  });
};

/*===============  文件上传  ===============*/
/**
 * 多文件上传
 * @param {*} options 选项
 * @param {*} uploadIndex 当前上传的图片序号
 * @param {*} fileBox 已上传文件地址列表
 */
export const $uploadFile = function (options, uploadIndex = 0, fileBox) {
  fileBox = fileBox || [];
  // 默认选项
  const defaultOptions = {
    url: '/api-file/files-anon',
    baseUrl: uploadFileURL,
    method: 'POST',
    header: requestHeader(options.isJson, options.noToken, options.method), // 请求头
    fileList: [], // 文件列表
    loading: true,
    loadingWord: '上传中...',
    isJson: false,
    noToken: false,
    completeCB: '', // 完成后的回调
    errorTipsShow: true, // 错误提示（并非所有错误提示），作用在‘请求成功，但是res.data.success不为true’的情况【此时默认弹窗不会弹出，错误内容需要自行处理】

    formData: {}, // HTTP 请求中其他额外的 form data
    name: 'file', // 上传文件的名称
  };

  // 属性覆盖
  Object.assign(defaultOptions, options);

  // 等待动画
  if (defaultOptions.loading) {
    wx.showLoading({
      title: defaultOptions.loadingWord,
      mask: true, // 显示透明蒙层，防止触摸穿透
      // duration: 9999,
    });
  }

  return new Promise((resolve, reject) => {
    // console.log(
    //   defaultOptions.fileList[uploadIndex],
    //   'defaultOptions.fileList[uploadIndex]'
    // );

    console.log(
      {
        url: defaultOptions.baseUrl + defaultOptions.url,
        filePath: defaultOptions.fileList[uploadIndex],
        name: 'file',
        header: defaultOptions.header,
        formData: {
          ...defaultOptions.formData,
          // token: getToken(),
        },
      },
      'defaultOptions.fileList[uploadIndex]'
    );

    // 文件上传
    wx.uploadFile({
      url: defaultOptions.baseUrl + defaultOptions.url,
      filePath: defaultOptions.fileList[uploadIndex],
      name: 'file',
      header: defaultOptions.header,
      formData: {
        ...defaultOptions.formData,
        token: getToken(),
      },
      // success
      success: function (res) {
        let data = res.data;
        data = JSON.parse(data);
        res.data = data;

        if (res.statusCode === 200) {
          if (res.data.url) {
            // 上传成功继续上传
            console.log(res, `${uploadIndex}文件上传成功 res.data.url`);
            uploadIndex++;
            fileBox.push(res.data);
            return resolve({ res, options, uploadIndex, fileBox });
          } else {
            // 其他错误
            if (defaultOptions.errorTipsShow) {
              // 不显示错误提示（需要之后单独处理）
              wx.showModal({
                title: `服务器请求失败`,
                content: res.data.msg || '未知错误',
                showCancel: false,
              });
            }
            console.log(res);
            reject({ res, fileBox });
          }
        } else {
          // 返回码不为200
          wx.showModal({
            title: '请求失败',
            content: `错误码:${res.statusCode}`,
            showCancel: false,
          });
          reject({ res, fileBox });
        }
      },
      fail: function (res) {
        wx.showToast({
          title: '上传失败',
          icon: 'none',
          duration: 2000,
        });
        reject({ res, fileBox });
      },
      complete: function () {
        if (defaultOptions.loading) wx.hideLoading();
        if (typeof completeCB === 'function') completeCB();
      },
    });
  }).then(({ res, options, uploadIndex, fileBox }) => {
    // 判断是否继续上传
    if (uploadIndex < options.fileList.length) {
      // 递归上传
      return $uploadFile(options, uploadIndex, fileBox);
    } else {
      return Promise.resolve({ res, fileBox });
    }
  });
};

/*==============================================  辅助函数  ==============================================*/
/**
 * 拼接 请求头
 * @param {*} isJson
 * @param {*} noToken
 * @param {*} method
 */
function requestHeader(isJson, noToken, method) {
  // 判断是否需要token
  const token = noToken ? 'undefined' : getToken();
  // const version = getServiceVersion();

  const result = {
    'content-type': isJson
      ? 'application/json'
      : 'application/x-www-form-urlencoded;charset=utf-8',
    'X-Requested-With':
      method && method.toUpperCase() === 'POST' ? 'XMLHttpRequest' : undefined,
    charset: 'UTF-8', // 默认值
    timestamp: new Date().getTime(),
    'x-access-token': token || undefined,
    // version: version || undefined, // 已获取的服务器版本号
  };

  /*===============  过滤无用属性  ===============*/
  for (let key in result) {
    if (result[key] === undefined) delete result[key];
  }
  return result;
}

/**
 * 重新登录
 */
function reLogin(defaultOptions) {
  // console.log(defaultOptions, 'defaultOptions reLogin');
  let url = splicingPath(AUTH_PATH, defaultOptions.redirect);
  wx.$router.push({ url });
}
